home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / LIBRARY / BPL70N16 / ARISOURC.ZIP / FPFLT.ASM < prev    next >
Assembly Source File  |  1993-03-07  |  3KB  |  78 lines

  1.  
  2. ; *******************************************************
  3. ; *                                                     *
  4. ; *     Turbo Pascal Runtime Library Version 7.0        *
  5. ; *     Real Longint -> Real Conversion                 *
  6. ; *                                                     *
  7. ; *     Copyright (C) 1989-1993 Norbert Juffa           *
  8. ; *                                                     *
  9. ; *******************************************************
  10.  
  11.              TITLE   FPFLT
  12.  
  13.  
  14. CODE         SEGMENT BYTE PUBLIC
  15.  
  16.              ASSUME  CS:CODE
  17.  
  18. ; Publics
  19.  
  20.              PUBLIC  RealFloat,RFloat
  21.  
  22. ;-------------------------------------------------------------------------------
  23. ; RealFloat converts a four byte signed long integer number to the six byte
  24. ; TURBO-Pascal floating point format.
  25. ;
  26. ; INPUT:     DX:AX      longint number
  27. ;
  28. ; OUTPUT:    DX:BX:AX   real number
  29. ;
  30. ; DESTROYS:  AX,BX,CH,DX,Flags
  31. ;-------------------------------------------------------------------------------
  32.  
  33. RealFloat    PROC    NEAR
  34.              MOV     BX, AX            ; save low word of longint
  35.              OR      AX, DX            ; is longint = 0 ?
  36.              JZ      $real_zero        ; yes, result is real zero
  37.              MOV     CH, 7Fh           ; load mask for sign bit
  38.              OR      CH, DH            ; extract sign bit (clear carry flag)
  39.              JNS     $long_pos         ; no sign bit, number is positive
  40.              NEG     DX                ; negate
  41.              NEG     BX                ;  long integer
  42. $long_pos:   SBB     DX, 0             ;   in DX:BX
  43.              MOV     AX, 0A0h          ; set exponent (assume all bits set)
  44.              JNZ     $hiword_set       ; high word of longint not zero
  45.              XCHG    DX, BX            ; do a 16-bit left shift on DX:BX
  46.              MOV     AL, 90h           ; assume last 24 bits in longint set
  47. $hiword_set: OR      DH, DH            ; test, wether more than 16 bits set
  48.              JNZ     $hibyte_set       ; yes, exponent correct
  49.              SUB     AL, 8             ; adjust exponent
  50.              OR      DH, DL            ; do an
  51.              MOV     DL, BH            ;  eight bit
  52.              MOV     BH, BL            ;   left shift
  53.              MOV     BL, AH            ;    on DX:BX
  54. $hibyte_set: JS      $normalized       ; yes, mantissa ready
  55.  
  56.              ALIGN   4
  57.  
  58. $shift_bit:  DEC     AX                ; adjust exp. for left shift of mantissa
  59.              ADD     BX, BX            ; shift mantissa one
  60.              ADC     DX, DX            ;  bit to the left
  61.              JNS     $shift_bit        ; until msb of mantissa set
  62. $normalized: AND     DH, CH            ; mask out sign bit if necessary
  63. $real_zero:  RET                       ; done
  64. RealFloat    ENDP
  65.  
  66.              ALIGN   4
  67.  
  68. RFloat       PROC    FAR
  69.              CALL    RealFloat         ; perform conversion longint to real
  70.              RET                       ; done
  71. RFloat       ENDP
  72.  
  73.              ALIGN   4
  74.  
  75. CODE         ENDS
  76.  
  77.              END
  78.